home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / By the Book / Mac C Primer V2 / 3.3 - MDEF Rewrite / MDEF.c next >
C/C++ Source or Header  |  1993-04-01  |  5KB  |  219 lines

  1. /********************************************************/
  2. /*                                                        */
  3. /*    MDEF Code from Chapter Three of                        */
  4. /*                                                        */
  5. /*    The Macintosh Programming Primer, Volume II,        */
  6. /*                    Second Edition                        */
  7. /*                                                        */
  8. /*    Copyright 1993, Dave Mark                            */
  9. /*                                                        */
  10. /*    This program demonstrates specific Mac programming    */
  11. /*    techniques.                                            */
  12. /*                                                        */
  13. /********************************************************/
  14.  
  15.  
  16. #define    kTopMargin        1
  17. #define kLeftMargin        2
  18.  
  19.  
  20. void    DoSizeMessage( MenuHandle menu, Rect *menuRectPtr );
  21. void    DoDrawMessage( MenuHandle menu, Rect *menuRectPtr );
  22. void    DoChooseMessage( MenuHandle menu, Rect *menuRectPtr,
  23.                 Point hitPt, short *whichItemPtr );
  24. void    InvertItem( short itemNumber, short itemHeight, Rect *menuRectPtr );
  25. void    DrawCenteredPict( PicHandle pic, Rect *rectPtr );
  26. void    CalcitemHeightAndWidth( short basePICTid, short numPICTs,
  27.                 short *widthPtr, short *heightPtr );
  28. void    GetNumPICTs( MenuHandle menu, short *baseIDPtr,
  29.                 short *numPICTsPtr );
  30.  
  31.  
  32. /*********************************** main */
  33.  
  34. pascal void    main( short message,
  35.                     MenuHandle menu,
  36.                     Rect *menuRectPtr,
  37.                     Point hitPt,
  38.                     short *whichItemPtr )
  39. {
  40.     switch( message )
  41.     {
  42.         case mDrawMsg:
  43.             DoDrawMessage( menu, menuRectPtr );
  44.             break;
  45.         case mChooseMsg:
  46.             DoChooseMessage( menu, menuRectPtr, hitPt, whichItemPtr );
  47.             break;
  48.         case mSizeMsg:
  49.             DoSizeMessage( menu, menuRectPtr );
  50.             break;
  51.     }
  52. }
  53.  
  54.  
  55. /*********************************** DoSizeMessage */
  56.  
  57. void    DoSizeMessage( MenuHandle menu,
  58.                         Rect *menuRectPtr )
  59. {
  60.     short        basePICTid, numPICTs, maxPICTWidth, maxPICTHeight;
  61.     
  62.     GetNumPICTs( menu, &basePICTid, &numPICTs );
  63.     CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
  64.     
  65.     (**menu).menuWidth = maxPICTWidth + 2 * kLeftMargin;
  66.     (**menu).menuHeight = (maxPICTHeight + kTopMargin * 2) * numPICTs;
  67. }
  68.  
  69.  
  70. /*********************************** DoDrawMessage */
  71.  
  72. void    DoDrawMessage( MenuHandle menu,
  73.                         Rect *menuRectPtr )
  74. {
  75.     short        basePICTid, numPICTs, maxPICTWidth, maxPICTHeight, itemHeight, i;
  76.     Rect        r, tempRect;
  77.     PicHandle    pic;
  78.     
  79.     GetNumPICTs( menu, &basePICTid, &numPICTs );
  80.     CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
  81.     
  82.     itemHeight = maxPICTHeight + kTopMargin * 2;
  83.     
  84.     r.top = menuRectPtr->top + kTopMargin;
  85.     r.left = menuRectPtr->left + kLeftMargin;
  86.     r.bottom = r.top + maxPICTHeight;
  87.     r.right = r.left + maxPICTWidth;
  88.             
  89.     for ( i=0; i<numPICTs; i++ )
  90.     {
  91.         pic = GetPicture( basePICTid + i );
  92.         
  93.         DrawCenteredPict( pic, &r );
  94.         
  95.         OffsetRect( &r, 0, itemHeight );
  96.     }
  97. }
  98.  
  99.  
  100. /*********************************** DoChooseMessage */
  101.  
  102. void    DoChooseMessage( MenuHandle menu,
  103.                             Rect *menuRectPtr,
  104.                             Point hitPt,
  105.                             short *whichItemPtr )
  106. {
  107.     short    basePICTid, selectedItem, numPICTs, maxPICTWidth, maxPICTHeight, itemHeight;
  108.     Rect    r;
  109.     
  110.     GetNumPICTs( menu, &basePICTid, &numPICTs );
  111.     CalcitemHeightAndWidth( basePICTid, numPICTs, &maxPICTWidth, &maxPICTHeight );
  112.     
  113.     itemHeight = (2 * kTopMargin) + maxPICTHeight;
  114.     
  115.     if ( PtInRect( hitPt, menuRectPtr ) )
  116.     {
  117.         selectedItem = ( (hitPt.v - menuRectPtr->top) / itemHeight ) + 1;
  118.         
  119.         if ( ( *whichItemPtr > 0 ) && ( *whichItemPtr != selectedItem ) )
  120.         {
  121.             InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
  122.         }
  123.         
  124.         if ( *whichItemPtr != selectedItem )
  125.         {
  126.             *whichItemPtr = selectedItem;
  127.             InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
  128.         }
  129.     }
  130.     else if ( *whichItemPtr > 0 )
  131.     {
  132.         InvertItem( *whichItemPtr, itemHeight, menuRectPtr );
  133.         *whichItemPtr = 0;
  134.     }
  135. }
  136.  
  137.  
  138. /*********************************** InvertItem */
  139.  
  140. void    InvertItem( short itemNumber,
  141.                     short itemHeight,
  142.                     Rect *menuRectPtr )
  143. {
  144.     Rect    r;
  145.     
  146.     r = *menuRectPtr;
  147.     
  148.     r.top += ( (itemNumber-1) * itemHeight );
  149.     r.bottom = r.top + itemHeight;
  150.     
  151.     InvertRect( &r );
  152. }
  153.  
  154.  
  155. /*********************************** DrawCenteredPict */
  156.  
  157. void    DrawCenteredPict( PicHandle pic,
  158.                             Rect *rectPtr )
  159. {
  160.     Rect    pictRect;
  161.     
  162.     pictRect = (**pic).picFrame;
  163.     
  164.     OffsetRect( &pictRect, rectPtr->left - pictRect.left,
  165.                            rectPtr->top     - pictRect.top);
  166.     OffsetRect( &pictRect,(rectPtr->right - pictRect.right)/2,
  167.                           (rectPtr->bottom - pictRect.bottom)/2);
  168.     
  169.     DrawPicture( pic, &pictRect );
  170. }
  171.  
  172.  
  173. /*********************************** CalcitemHeightAndWidth */
  174.  
  175. void    CalcitemHeightAndWidth( short basePICTid,
  176.                                 short numPICTs,
  177.                                 short *widthPtr,
  178.                                 short *heightPtr )
  179. {
  180.     short        i;
  181.     Rect        r;
  182.     PicHandle    pic;
  183.     
  184.     *widthPtr = 0;
  185.     *heightPtr = 0;
  186.     
  187.     for ( i=0; i<numPICTs; i++ )
  188.     {
  189.         pic = GetPicture( basePICTid + i );
  190.         r = (**pic).picFrame;
  191.         
  192.         if ( r.bottom - r.top > *heightPtr )
  193.             *heightPtr = r.bottom - r.top;
  194.             
  195.         if ( r.right - r.left > *widthPtr )
  196.             *widthPtr = r.right - r.left;
  197.     }
  198. }
  199.  
  200.  
  201. /*********************************** GetNumPICTs */
  202.  
  203. void    GetNumPICTs( MenuHandle menu,
  204.                         short *baseIDPtr,
  205.                         short *numPICTsPtr )
  206. {
  207.     Handle    longHandle;
  208.     long    retrievedLong;
  209.     short    menuID;
  210.     
  211.     menuID = (**menu).menuID;
  212.     
  213.     longHandle = GetResource( 'long', menuID );
  214.     
  215.     retrievedLong = (*((long *)(*longHandle)));
  216.     
  217.     *baseIDPtr = HiWord( retrievedLong );
  218.     *numPICTsPtr = LoWord( retrievedLong );
  219. }